/*******************************************************************************
* 
*    Copyright(C) 2018 BX All rights reserved.
* 
* File        : driver.h
* Author      : BX
* Version     : V1.00
* Date        : 2018-1-1
* Description : 驱动代码
* Chip        : HC32L136
* History     : V1.00, 2018-1-1, bx, first version

* Disclaimer  :
*   本程序所有权归作者所有。
*   本程序仅用于演示或实现特定产品的功能，任何修改或其它目的的应用均不作保证，
*   未经作者同意不得将本程序的全部或部分用于商业目的。
*******************************************************************************/
#ifndef __DRIVER_H__
#define __DRIVER_H__

#include "ddl.h"
#include "gpio.h"
#include "wdt.h"
#include "lvd.h"
#include "rtc.h"
#include "lptim.h"
#include "lpm.h"
#include "bt.h"
#include "adt.h"
#include "uart.h"
#include "lpuart.h"
#include "adc.h"
#include "vc.h"
#include "flash.h"
#include "lcd.h"


////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
typedef struct
{
    uint8_t rtc_int;
    uint8_t lpt_int;
    
    uint8_t key1_down;
    uint8_t key2_down;
}DRIVER;
extern DRIVER driver;

////////////////////////////////////////////////////////////////////////////////

#define Att7022CS_1				Gpio_SetIO(GpioPortD, GpioPin4)
#define Att7022CS_0				Gpio_ClrIO(GpioPortD, GpioPin4)
#define Att7053CS_1				Gpio_SetIO(GpioPortB, GpioPin7)
#define Att7053CS_0				Gpio_ClrIO(GpioPortB, GpioPin7)

#define SCLK_1						Gpio_SetIO(GpioPortD, GpioPin5)
#define SCLK_0						Gpio_ClrIO(GpioPortD, GpioPin5)
#define SDI_1							Gpio_SetIO(GpioPortA, GpioPin4)
#define SDI_0							Gpio_ClrIO(GpioPortA, GpioPin4)
#define AttRST_1					Gpio_SetIO(GpioPortA, GpioPin6)
#define AttRST_0					Gpio_ClrIO(GpioPortA, GpioPin6)

#define TEST_1						Gpio_SetIO(GpioPortB, GpioPin9)
#define TEST_0						Gpio_ClrIO(GpioPortB, GpioPin9)

#define PowOFF_LED_0			Gpio_SetIO(GpioPortA, GpioPin1)
#define PowOFF_LED_1			Gpio_ClrIO(GpioPortA, GpioPin1)
#define Run_LED_0	  			Gpio_SetIO(GpioPortA, GpioPin7)
#define Run_LED_1					Gpio_ClrIO(GpioPortA, GpioPin7)
#define Fault_LED_0				Gpio_SetIO(GpioPortA, GpioPin2)
#define Fault_LED_1				Gpio_ClrIO(GpioPortA, GpioPin2)
#define Back_LED_1				Gpio_SetIO(GpioPortA, GpioPin3)
#define Back_LED_0				Gpio_ClrIO(GpioPortA, GpioPin3)


#define key1							Gpio_GetInputIO(GpioPortC, GpioPin12)
#define key2							Gpio_GetInputIO(GpioPortC, GpioPin11)
#define key3							Gpio_GetInputIO(GpioPortC, GpioPin10)
#define key4							Gpio_GetInputIO(GpioPortA, GpioPin15)

#define SDO				     		Gpio_GetInputIO(GpioPortA, GpioPin5)


////////////////////////////////////////////////////////////////////////////////
#define ei()							__enable_irq()
#define di()    					__disable_irq()  
#define nop()   					__NOP()
#define wait()  					__WFI();
#define soft_reset()			NVIC_SystemReset()


void delay_us(uint16_t us);
void delay_ms(uint16_t ms);

#define wdt_reset()     {M0P_WDT->RST = 0x1E;  M0P_WDT->RST = 0xE1;}


void clock_init(void);
void port_init(void);
void beep(uint16_t ms);

void rtc_init(void);
void lpt_init(void);
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// LCD
#define LCD_G       0xDE
#define LCD_O       0x36
#define LCD_D       0x3E
#define LCD_I       0x0A
#define LCD_C       0xF0
#define LCD_A       0xEE
#define LCD_E       0xF4
                       
#define LCD_B       0x76
#define LCD_U       0x7A
#define LCD_S       0xD6
#define LCD_Y       0x5E

#define LCD_MINUS   0x04

#define LCD_H       0x6E
#define LCD_T2      0xE0

#define LCD_L       0x70
#define LCD_P       0xEC


void lcd_init(void);
void lcd_clear(void);
void lcd_enable(void);
void lcd_disable(void);

void lcd_write_code(uint8_t i, uint8_t c);
void lcd_write_char(uint8_t i, uint8_t d);


#define     VER								31			// 软件版本（主版本号）
#define     Brand							1				// 品牌：山鹰=1   赛福德=0；
#define     PASSWORD 					1				// 密码
#define     S100							10000		// 50mS *20*100
#define     ADBUFF_MAX				10      // 采样缓冲区的最大空间（计算每次需要采样的次数）
#define			NMM								3				// 信息发送次数
     
#define     ADDR_MIN					1				// 设置的地址的最小数
#define     ADDR_MAX					200			// 设置的地址的最大数
#define     Overrun_Counts		200			// 状态故障上限次数
#define     L_Over_Counts			3				// 线路故障上限次数
#define     Phase_Counts			2500		// 错相计数上限
#define     Dog_Set						0x36		// 喂狗设置
#define     Line_H						300			// 线路电压上限值
#define     Line_L						20			// 线路电压下限值
#define     Line_U						50			// 若线路电流值大于5.0不进行线路检测

#define     Koff							0.8							// 断电系数（Koff乘以下限值为断电值）
#define     K7022							0.9228					// 交流系数

#define     KDC								0.20738*1.4618					// 直流系数

#define     KAC050						0.160317*33/100	// 互感器 7022系数
#define     KAC100						0.160317/2.941
#define     KAC200						0.160317/1.4705
#define     KAC300						0.160317

#define     KAC53050					0.1*44/76.1			// 互感器 7053系数
#define     KAC53100					0.1*41.2/23.4
#define     KAC53200					0.1*41.2/23.4
#define     KAC53300					0.1*41.2/23.4

//---------产品编号-----------------------------------------------------------
#define     YB49780						1			// 器件类型	（1路直流电压，3路单项电压、电流）
#define     YB49751						2			// 器件类型	（双路单相电压、电流 ）
#define     YB49711						3			// 器件类型 （7路单相电压）
#define     YB49771						4			// 器件类型	（1路三相电压、电流（有零线））
#define     YB49761						5			// 器件类型 （1路三相电压、电流（无零线））
#define     YB49772						6			// 器件类型	（双路三相电压、电流（有零线））
#define     YB49762						7			// 器件类型	（双路三相电压、电流（无零线））
#define     YB49721						8			// 器件类型	（双路三相电压（有零线））
#define     YB49731						9			// 器件类型	（双路三相电压（无零线））

/************************************************************************/
// EEPROM 使用定义				// （第一扇区 000-1FF）
#define			Set_parameters_Addr			0x0000FF00		// 设置参数地址			
//					0x0000FF00							模块地址
//					0x0000FF01							模块类型
//					0x0000FF02							1通道过压上限 H
//					0x0000FF03							1通道过压上限 L
//					0x0000FF04							2通道过压上限 H
//					0x0000FF05							2通道过压上限 L
//                                  ......
//					0x0000FF12							9通道过压上限 H
//					0x0000FF13							9通道过压上限 L

//					0x0000FF14							1通道欠压下限 H
//					0x0000FF15							1通道欠压下限 L
//					0x0000FF16							2通道欠压下限 H
//					0x0000FF17							2通道欠压下限 L
//                                  ......
//					0x0000FF24							9通道欠压下限 H
//					0x0000FF25							9通道欠压下限 L

//					0x0000FF26							1通道开关设置 D7-通道开关   1关闭、0开启
//					0x0000FF27							2通道开关设置 D6-冷备开关		1关闭、0开启
//					0x0000FF28							3通道开关设置 D2-D0					电流互感器代号
//					0x0000FF29							4通道开关设置
//					0x0000FF2a							5通道开关设置
//					0x0000FF2b							6通道开关设置
//					0x0000FF2c							7通道开关设置 
//					0x0000FF2d							8通道开关设置 
//					0x0000FF2e							9通道开关设置 

#define			Channel_factor_Addr			0x0000FF80		
// 					0x0000FF80							U0通道系数地址 	    
//					0x0000FF84							U1通道系数地址
//					0x0000FF88							U2通道系数地址
//					0x0000FF8c							U3通道系数地址
//					0x0000FF90							U4通道系数地址
//					0x0000FF94							U5通道系数地址
//					0x0000FF98							U6通道系数地址
//					0x0000FF9c							U7通道系数地址
//					0x0000FFA0							U8通道系数地址
#define			SET_REC_ADDR						0x0000FFF0 				
//					0x0000FFF0				// 保存标志1 0x55 地址
//					0x0000FFF1				// 保存标志2 0xAA 地址

struct 		Module_Set_Info			// 器件设置信息
{
	uint8_t		My_Address;				// 器件地址
	uint8_t		Module_Type;			// 器件类型
	uint16_t	CHn_Caps[9];			// 通道过压(过流)上限 
	uint16_t	CHn_Limit[9];			// 通道欠压下限
	uint8_t		CHn_Switch[9];		// 通道开关	D7-通道开关   	1关闭、0开启
															//					D6-冷备开关		1关闭、0开启
															//					D5-		
															//					D4-			
															//					D3-
															//					D2-电流互感器代号
															//					D1-电流互感器代号
															//					D0-电流互感器代号	
	float			Uk[9];			   		// 1-9 通道系数
};
/************************************************************************/
struct  	a
{
	uint8_t		flag_power_Status;// 断电标志	 		0x80
															// 欠压标志	 		0x40
															// 过压标志	 		0x20
															// 过流标志  		0x10
															// 缺相标志	 		0x08
															// 错相标志	 		0x04
															// 互感器故障标志	0x02
															// 备用空
};												

struct  	b
{ 
	uint8_t		power_off;				// 断电计数器
	uint8_t		power_low;				// 欠压计数器
	uint8_t		power_overvoltage;// 过压过流计数器
	uint8_t		power_overcurrent;// 过过流计数器
	uint8_t		Phase_lack;				// 缺相计数器
	uint16_t	Phase_error;			// 错相计数器
	uint8_t		coil_fault; 			// 互感器故障计数器
};

struct  	c
{
	uint8_t		Set_g[9];					// 计数器
	uint8_t		Set_s[9];					// 计数器
	uint8_t		Set_b[9];					// 计数器
	uint8_t		Pass_g[9];				// 计数器
	uint8_t		Pass_s[9];				// 计数器
	uint8_t		Pass_b[9];				// 计数器
};

#endif /* __DRIVER_H__ */
